<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    function bar() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          // reject("发生错误了")
          resolve('123')
          console.log("时间结束");
        }, 2000)
      })

    }
    // 普通函数默认return 一个undefine   异步函数默认返回一个Promise

    // await 必须在异步函数中使用  await后边跟一个promise对象才有意义
    async function foo() {
      // await 就很类似于yield 就是阻止你继续执行，等到后边的代码有结果后再放行
      //  await 后边如果跟着一个Promise，那么会等待Promise有结果之后，才会继续执行后续的代码
      let res1 = await bar()
      console.log('await后边的代码', res1);
      let res2 = await bar()
      console.log('await后边的代码', res2);

      /* 
      
      如果上边有异常，可以在函数调用那里捕获异常。
      上边如果出现异常，就相当于 return Promise.resolve(一个状态为rejected的Promise)
      那返回的promise肯定就是rejected状态了，这个异常就可以在函数调用那里轻松捕获
      */
    }
    foo().catch(err => {
      console.log(err);
    })
  </script>
</body>

</html>